// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "net/cert/signed_certificate_timestamp.h"

#include <string>

#include "base/pickle.h"
#include "net/test/ct_test_util.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace net {

namespace ct {

    namespace {

        const char kLogDescription[] = "somelog";

        class SignedCertificateTimestampTest : public ::testing::Test {
        public:
            void SetUp() override
            {
                GetX509CertSCT(&sample_sct_);
                sample_sct_->origin = SignedCertificateTimestamp::SCT_FROM_OCSP_RESPONSE;
                sample_sct_->log_description = kLogDescription;
            }

        protected:
            scoped_refptr<SignedCertificateTimestamp> sample_sct_;
        };

        TEST_F(SignedCertificateTimestampTest, PicklesAndUnpickles)
        {
            base::Pickle pickle;

            sample_sct_->Persist(&pickle);
            base::PickleIterator iter(pickle);

            scoped_refptr<SignedCertificateTimestamp> unpickled_sct(
                SignedCertificateTimestamp::CreateFromPickle(&iter));

            SignedCertificateTimestamp::LessThan less_than;

            ASSERT_FALSE(less_than(sample_sct_, unpickled_sct));
            ASSERT_FALSE(less_than(unpickled_sct, sample_sct_));
            ASSERT_EQ(sample_sct_->origin, unpickled_sct->origin);
            ASSERT_EQ(sample_sct_->log_description, unpickled_sct->log_description);
        }

        TEST_F(SignedCertificateTimestampTest, SCTsWithDifferentOriginsNotEqual)
        {
            scoped_refptr<SignedCertificateTimestamp> another_sct;
            GetX509CertSCT(&another_sct);
            another_sct->origin = SignedCertificateTimestamp::SCT_FROM_TLS_EXTENSION;

            SignedCertificateTimestamp::LessThan less_than;

            ASSERT_TRUE(less_than(sample_sct_, another_sct) || less_than(another_sct, sample_sct_));
        }

    } // namespace

} // namespace ct

} // namespace net
